package com.shujia.day02;

public class Demo02VarCompute {
    public static void main(String[] args) {
        /*
            TODO 对于类型之间进行数据计算 以+为例
                ① 在Java中对于两个变量进行计算时，会对其类型进行提升 默认提升到 int类型进行计算
                    byte1 + short1 => 计算后的结果是 int 类型 => int转short不能隐式转换
                ② 在代码中，对两个数值进行相加时，在内存中是以两个值相加的结果进行保存，保存之后会再将结果赋予给 short 类型
                        就相当于 short 类型的定义  => byte byte1 = 10;
                ③ 对于字符以及字符串加法运算
                    对于字符串相加 其形式为字符串拼接结果
                    对于字符进行相加计算  其结果形式为 int 类型
         */

        byte byte1 = 10;
        short short1 = 5;
//        short computeShort = byte1 + short1;
        short computeShort = 10 + 5;
        int computeInt = byte1 + short1;
        long computeLong = byte1 + short1;

        short short2 = 129;
        byte byte2 = (byte)short2;
        System.out.println(byte2); // -127 ? 为什么 =?> 原码补码反码

        /*
            强制类型转换计算过程：
                short 使用2个字节用于保存数据
                short short2 = 129; =>
                原码：就是二进制定点表示法，即最高位为符号位，“0”表示正，“1”表示负，其余位表示数值的大小。
                反码：正数的反码与其原码相同；负数的反码是对其原码逐位取反，但符号位除外
                补码：正数的补码与其原码相同；负数的补码是在其反码的末位加1
                   原码:  0 0000000 10000001 (两个字节长度，最高位表示符号)
                   反码:  0 0000000 10000001
                   补码:  0 0000000 10000001

           强制类型转换:
                   补码: 1 0000001
      将补码的数据-1 反码: 1 0000000
     将反码数据转原码 原码: 1 1111111 => -127
         */
//        System.out.println(0b1111111);

        char ch = 'a';
        int int1 = ch;
        System.out.println(int1); // 97

        int int2 = ch + 1;
        System.out.println(int2); // 98

        char ch2 = (char) int2;
        System.out.println(ch2); // b


        // 字符串
        String str = "value:";
        String computeStr = str + ch2;
        System.out.println(computeStr); // value:b

        String str2 = "10";
        System.out.println(str2+1); // 101

    }
}
